package com.proyecto.core.vista.echo.componentes;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import com.proyecto.core.Utilidades.UtilReflect;
import com.proyecto.core.modelo.echo.constantes.ParametrosIniciales;

import echopointng.table.SortableTableModel;
import nextapp.echo2.app.Row;
import nextapp.echo2.app.Column;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.list.DefaultListModel;
import nextapp.echo2.app.TextField;
import nextapp.echo2.app.SelectField;
import nextapp.echo2.app.Button;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.layout.ColumnLayoutData;
import nextapp.echo2.app.Alignment;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.ResourceImageReference;
import nextapp.echo2.app.ApplicationInstance;
import nextapp.echo2.app.Table;
import nextapp.echo2.app.Label;
import nextapp.echo2.app.layout.RowLayoutData;
import nextapp.echo2.app.Insets;
import nextapp.echo2.app.CheckBox;

public class RowPSTabla extends Row {

	private static final long serialVersionUID = 1L;

	private ResourceBundle resourceBundle;

	private Row rowTabla;

	private PSTabla tabla;

	private Row rowFiltrado;

	private DefaultListModel dlm = new DefaultListModel();

	private SelectField CbCampo;

	private TextField txtText;

	private List resultadosSinFiltro = null;
	
	private List<Object> resultadosFiltrados = new ArrayList<Object>();

	private Table tTabla;
	
	private int directivaOrden = SortableTableModel.ASCENDING;

	private Button btnAtras;

	private Button btnProximo;

	private Label lblPagina;
	
	private int resulXPagina = ParametrosIniciales.FILAS_X_PAGINAS;
	
	private int paginaActual = 1;
	
	private int totalPaginas = 1;
	
	private boolean esPaginable = ParametrosIniciales.PAGINABLE.equalsIgnoreCase("N")?false:true;
	
	private String tipoPaginacion;

	private TextField txtPaginaActual;

	private Row rwPaginacion;
	
	private List resultadosDatosTodos = null;

	private Button btnFiltrar;

	/**
	 * Creates a new <code>RowPSTabla</code>.
	 */
	public RowPSTabla(int ordenamiento ) {
		super();
		initComponents();
		tabla = new PSTabla();
		CbCampo.setSelectedIndex(0);
		directivaOrden = ordenamiento;	
		rwPaginacion.setVisible(esPaginable);
		tipoPaginacion = esPaginable?ParametrosIniciales.PAGINABLE:null;
		//System.out.println("tipoPaginacion: " + tipoPaginacion);
		//System.out.println("esPaginable: " + esPaginable);
		if(tipoPaginacion!=null && tipoPaginacion.equalsIgnoreCase("SIN_REFRESCAR")){
			btnProximo.addActionListener(listenerProximoSinRefrescar);
			btnAtras.addActionListener(listenerAnterioresSinRefrescar);
		}
	}
	
	private void cargarFiltros() {
		ArrayList<String> titulos = tabla.getTitulos();
		dlm.add(resourceBundle.getString("CoreVista.componentes.rowpstabla.MostrarTodos"));
		for (int i = 0; i < titulos.size(); i++) {
			dlm.add(titulos.get(i));
		}
		CbCampo.setModel(dlm);
	}

	public ArrayList<String> obtenerTituloTabla(){
		ArrayList<String> titulos = tabla.getTitulos();
		return titulos;
	}
	
	/**
	 * 
	 * @return
	 */
	public ArrayList<String> obtenerCamposTabla(){
		ArrayList<String> campos = tabla.getCampos();
		return campos;
	}
	
	public String obtenerCamposSeleccionadoTabla(){
		String campitoTabla = "";
		try {
			ArrayList<String> campos = this.obtenerCamposTabla(); 
			campitoTabla = campos.get ( CbCampo.getSelectedIndex()-1);
			
		} catch (Exception e) {
			// TODO: handle exception
			
		}
		return campitoTabla;
		
	}
	
	/**
	 * 
	 * @return
	 */
	public String obtenerDatoParaFiltrar(){
		return txtText.getText().trim();
	}
	/**
	 * 
	 * @param titulo
	 * @param atributo
	 */
	public void incluirCampo(String titulo, String atributo) {
		tabla.incluirCampo(titulo, atributo);
	}

	public Object generarTabla() {
		tabla.generarTabla();
		rowTabla.add(tabla.getTabla());
		this.cargarFiltros();
		
		return tabla.getTabla();
	}

	public void cargarTabla(List listaDatos) {
		resultadosSinFiltro = copiarLista(listaDatos);
		//System.out.println("cargarTabla.resultadosSinFiltro.size():: " + resultadosSinFiltro.size());
		//System.out.println("cargarTabla.listaDatos.size():: " + listaDatos.size());
		if(esPaginable && tipoPaginacion.equalsIgnoreCase("SIN_REFRESCAR") ){//Si la tabla es paginable
			totalPaginas = listaDatos.size() % resulXPagina == 0? listaDatos.size()/resulXPagina:(listaDatos.size()/resulXPagina)+1;
			resultadosFiltrados = new ArrayList<Object>();//Inicializo los resultados sin filtros para paginar la lista de datos entrante
			if(listaDatos.size()>resulXPagina){//Si el total de los datos, es mayor que la cantidad de resultados que puedo mostrar por pagina
				for(int i = 0; i< resulXPagina; i++){//recorro la lista de pojos desde cero hasta el maximo de los resultados por pagina
					resultadosFiltrados.add(listaDatos.get(i));//los meto en resultadosFiltrados..
				}
			}else{//Si el total de los datos es igual o menor a la cantidad de resultados que puedo mostrar por pagina
				resultadosFiltrados = copiarLista(listaDatos);//Los resultadosFiltrados es la misma lista de pojos entrante.
			}
			tabla.cargarTabla(resultadosFiltrados);//Cargo los resultadosFiltrados
			txtPaginaActual.setText(paginaActual+"/"+totalPaginas);
		}else{
			resultadosFiltrados = copiarLista(listaDatos);//Realizo una copia de la lista entrante, y con ella lleno a los resultadosFiltrados
			tabla.cargarTabla(listaDatos);//Cargo la lista entrante
		}
		//this.CbCampo.setSelectedIndex(0);//Selecciono el primer elemento del combo de criterio de busqueda
		//this.txtText.setText("");//Limpio la caja de texto de busqueda.
	}
	
	public void cargarDatosCompletosParaFiltros(List listaDatosTodos){
		resultadosDatosTodos = copiarLista(listaDatosTodos);
	}
	
	public void cargarTablaPaginaRefrescando(List listaDatos) {
		resultadosSinFiltro = copiarLista(listaDatos);
		resultadosFiltrados = copiarLista(listaDatos);//Realizo una copia de la lista entrante, y con ella lleno a los resultadosFiltrados
		tabla.cargarTabla(listaDatos);//Cargo la lista entrante
		this.CbCampo.setSelectedIndex(0);//Selecciono el primer elemento del combo de criterio de busqueda
		this.txtText.setText("");//Limpio la caja de texto de busqueda.
	}

	public Object ManejaEvento(ActionEvent arg0) {
		tabla.ManejaEvento(arg0);
		return tabla.getPojo();
	}

	public void mostrarPojoFiltrado(Object o){
		List<Object> lista = new ArrayList<Object>();
		lista.add(o);
		tabla.cargarTabla(lista);
	}
	

	private void filtrarAction(ActionEvent w) {
		/*Verifico que en el combo no este seleccionado un "mostrar todos"*/
		if (CbCampo.getSelectedIndex() >0) {
			String textPojo = "";
			/*Obtengo una copia de la lista de pojos que retorno el servicio*/
			resultadosFiltrados = copiarLista(tabla.getList());
			//resultadosFiltrados = copiarLista(resultadosSinFiltro);
			
			/*con el anterior funciona pero con la pagina activa (paginacion) y no con toooodo el listado */
			//System.out.println("resultadosDatosTodos.size():: " + resultadosDatosTodos.size());
			//resultadosFiltrados = copiarLista(resultadosDatosTodos);
			//probando otra forma de filtro con datos completos
			//*resultadosFiltrados = copiarLista(l)
			//System.out.println("resultadosFiltrados.size():: " + resultadosFiltrados.size());
			//System.out.println("resultadosFiltrados.size():: " + resultadosSinFiltro.size());
			/*
			 * Recorro el arreglo de pojos. La primera vez el size sera el mismo que el que retorno el servicio
			 * Luego deberia ir disminuyendo segun la cantidad de veces que el usuario presione la tecla filtrar..
			 * */
			List<Object> resultadosFiltrados1 = new ArrayList<Object>();
			for (int i = 0; i < resultadosFiltrados.size(); i++) {
				try {
					/*Obtengo el atributo que quiero comparar de cada pojo*/
					textPojo = UtilReflect.invocarMetodoGet(tabla.getList().get(i), tabla.getCampos().get(CbCampo.getSelectedIndex()-1).toString(), null).toString();
					//System.out.println("textPojo: " + textPojo);
					/*Comparo cada atributo del pojo, con el texto que introdujo el usuario*/
					//System.out.println("textPojo:: " + textPojo);
					//System.out.println("txtText:: " + txtText.getText());
					if (textPojo.toUpperCase().indexOf(txtText.getText().toUpperCase()) != -1) {
						/*Si el los atributos son coincidentes, meto en una lista dicho pojo*/
						resultadosFiltrados1.add(resultadosFiltrados.get(i));
					}
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			}
			/*Cargo en la tabla los resultados filtrados*/
			
			//System.out.println("resultadosFiltrados1.size():: " + resultadosFiltrados1.size());
			tabla.cargarTabla(resultadosFiltrados1);
		}else{
			if(tabla.getList()!=null){
				tabla.getList().clear();
				tabla.cargarTabla(copiarLista(resultadosSinFiltro));
			}
		}
		((SortableTableModel) (tabla.getTabla().getModel())).sortByColumn(0, directivaOrden);
		
	}
	
	public List filtrarEnTodaLaTabla(List resultadosPagina){
		List resultadosFiltrados1 = new ArrayList();
		
		if (CbCampo.getSelectedIndex() >0) {
			String textPojo = "";
			/*Obtengo una copia de la lista de pojos que retorno el servicio*/
			resultadosFiltrados = copiarLista(resultadosPagina);
			//System.out.println("filtrarEnTodaLaTabla.resultadosFiltrados.size():: " + resultadosFiltrados.size());
			//tabla.cargarTabla(resultadosFiltrados);
			/*
			 * Recorro el arreglo de pojos. La primera vez el size sera el mismo que el que retorno el servicio
			 * Luego deberia ir disminuyendo segun la cantidad de veces que el usuario presione la tecla filtrar..
			 * */
			for (int i = 0; i < resultadosFiltrados.size(); i++) {
				try {
					/*Obtengo el atributo que quiero comparar de cada pojo*/
					textPojo = UtilReflect.invocarMetodoGet(resultadosFiltrados.get(i), tabla.getCampos().get(CbCampo.getSelectedIndex()-1).toString(), null).toString();
					//System.out.println("textPojo: " + i + ": " + textPojo);
					/*Comparo cada atributo del pojo, con el texto que introdujo el usuario*/
					//System.out.println("textPojo:: " + textPojo);
					//System.out.println("txtText:: " + txtText.getText());
					if (textPojo.toUpperCase().indexOf(txtText.getText().toUpperCase()) != -1) {
						/*Si el los atributos son coincidentes, meto en una lista dicho pojo*/
						//System.out.println("*********************************txtText.getText().toUpperCase():: " + txtText.getText().toUpperCase());
						resultadosFiltrados1.add(resultadosFiltrados.get(i));
					}
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			}
			/*Cargo en la tabla los resultados filtrados*/
			
			System.out.println("resultadosFiltrados1.size():: " + resultadosFiltrados1.size());
			//tabla.cargarTabla(resultadosFiltrados1);
		}else{
			if(tabla.getList()!=null){
			//	tabla.getList().clear();
			//	tabla.cargarTabla(copiarLista(resultadosSinFiltro));
			}
		}
		//((SortableTableModel) (tabla.getTabla().getModel())).sortByColumn(0, directivaOrden);
		
		return resultadosFiltrados1;
	}
	
	public int encontrarPojoEnTabla(Object o){
		Object pojoId =null;
		int indice = -5;
		try {
			pojoId = UtilReflect.invocarMetodoGet(o, "id", null);
		} catch (Exception e) {
			e.printStackTrace(); 
		}
		for (int i=0; i<resultadosFiltrados.size();i++){
			try {
				if(pojoId.equals(UtilReflect.invocarMetodoGet(resultadosFiltrados.get(i), "id", null))){
					indice = i;
					break;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return indice;
	}
	
	public void mostrarRowPaginacion(boolean mostrar){
		rwPaginacion.setVisible(mostrar);
	}
	

	public void mostrarRowFitrado(boolean mostrar){
		rowFiltrado.setVisible(mostrar);
	}
	
	private List<Object> copiarLista(List l){
		List<Object> copia = new ArrayList<Object>();
		for(int i=0; i<l.size();i++){
			copia.add(l.get(i));
		}
		return copia;
	}

	public TextField getTxtText() {
		return txtText;
	}

	public void setTxtText(TextField txtText) {
		this.txtText = txtText;
	}

	public PSTabla getTabla() {
		return tabla;
	}

	public void setTabla(PSTabla tabla) {
		this.tabla = tabla;
	}

	public Row getRowFiltrado() {
		return rowFiltrado;
	}

	public void setRowFiltrado(Row rowFiltrado) {
		this.rowFiltrado = rowFiltrado;
	}

	public SelectField getCbCampo() {
		return CbCampo;
	}

	public void setCbCampo(SelectField cbCampo) {
		CbCampo = cbCampo;
	}

	public int getDirectivaOrden() {
		return directivaOrden;
	}

	public void setDirectivaOrden(int directivaOrden) {
		this.directivaOrden = directivaOrden;
	}

	public List getResultadosSinFiltro() {
		return resultadosSinFiltro;
	}

	public void setResultadosSinFiltro(List resultadosSinFiltro) {
		this.resultadosSinFiltro = resultadosSinFiltro;
	}

	
	private ActionListener listenerAnterioresSinRefrescar = new ActionListener(){
		public void actionPerformed(ActionEvent arg0) {
			if(paginaActual>1){
				resultadosFiltrados = new ArrayList<Object>();
				int hasta = paginaActual*resulXPagina>=resultadosSinFiltro.size()?//Estoy en la ultima pagina
						(resultadosSinFiltro.size()-resultadosFiltrados.size()):resulXPagina*(paginaActual-1);
				int desde = hasta -resulXPagina;
				while (desde<hasta){
					resultadosFiltrados.add(resultadosSinFiltro.get(desde));
					desde++;
				}
				paginaActual--;
				tabla.cargarTabla(resultadosFiltrados);
				txtPaginaActual.setText(paginaActual+"/"+totalPaginas);
			}
		}
	};
	
	private ActionListener listenerProximoSinRefrescar = new ActionListener(){
		public void actionPerformed(ActionEvent arg0) {
			if(resultadosSinFiltro.size()>paginaActual*resulXPagina){
				resultadosFiltrados = new ArrayList<Object>();
				int desde = paginaActual*resulXPagina;
				int hasta = (resulXPagina*(paginaActual+1))<=resultadosSinFiltro.size()?
						(resulXPagina*(paginaActual+1)):(resultadosSinFiltro.size());
				while (desde<hasta){
					resultadosFiltrados.add(resultadosSinFiltro.get(desde));
					desde++;
				}
				paginaActual++;
				tabla.cargarTabla(resultadosFiltrados);
				txtPaginaActual.setText(paginaActual+"/"+totalPaginas);
			}
		}
	};


	public Button getBtnAtras() {
		return btnAtras;
	}

	public void setBtnAtras(Button btnAtras) {
		this.btnAtras = btnAtras;
	}

	public Button getBtnProximo() {
		return btnProximo;
	}

	public void setBtnProximo(Button btnProximo) {
		this.btnProximo = btnProximo;
	}

	public int getPaginaActual() {
		return paginaActual;
	}

	public void setPaginaActual(int paginaActual) {
		this.paginaActual = paginaActual;
	}

	public int getResulXPagina() {
		return resulXPagina;
	}

	public void setResulXPagina(int resulXPagina) {
		this.resulXPagina = resulXPagina;
	}

	public int getTotalPaginas() {
		return totalPaginas;
	}

	public void setTotalPaginas(int totalPaginas) {
		this.totalPaginas = totalPaginas;
	}

	public TextField getTxtPaginaActual() {
		return txtPaginaActual;
	}

	public void setTxtPaginaActual(TextField txtPaginaActual) {
		this.txtPaginaActual = txtPaginaActual;
	}

	public boolean isEsPaginable() {
		return esPaginable;
	}

	public void setEsPaginable(boolean esPaginable) {
		this.esPaginable = esPaginable;
	}

	public Button getBtnFiltrar() {
		return btnFiltrar;
	}

	public void setBtnFiltrar(Button btnFiltrar) {
		this.btnFiltrar = btnFiltrar;
	}

	/**
	 * Configures initial state of component.
	 * WARNING: AUTO-GENERATED METHOD.
	 * Contents will be overwritten.
	 */
	private void initComponents() {
		resourceBundle = ResourceBundle.getBundle(
				"com.proyecto.core.vista.echo.resource.localization.etiquetas",
				ApplicationInstance.getActive().getLocale());
		Column column1 = new Column();
		add(column1);
		rwPaginacion = new Row();
		ColumnLayoutData rwPaginacionLayoutData = new ColumnLayoutData();
		rwPaginacionLayoutData.setAlignment(new Alignment(Alignment.CENTER,
				Alignment.DEFAULT));
		rwPaginacion.setLayoutData(rwPaginacionLayoutData);
		column1.add(rwPaginacion);
		btnAtras = new Button();
		ResourceImageReference imageReference1 = new ResourceImageReference(
				"/echopointng/resource/images/smallleftarrow.gif");
		btnAtras.setIcon(imageReference1);
		RowLayoutData btnAtrasLayoutData = new RowLayoutData();
		btnAtrasLayoutData.setInsets(new Insets(new Extent(0, Extent.PX),
				new Extent(0, Extent.PX), new Extent(20, Extent.PX),
				new Extent(0, Extent.PX)));
		btnAtras.setLayoutData(btnAtrasLayoutData);
		rwPaginacion.add(btnAtras);
		lblPagina = new Label();
		lblPagina.setText("Pagina");
		lblPagina.setStyleName("2OpenLabs.Label.Descripcion");
		rwPaginacion.add(lblPagina);
		txtPaginaActual = new TextField();
		txtPaginaActual.setWidth(new Extent(50, Extent.PX));
		txtPaginaActual.setStyleName("2OpenLabs.TextField.Descripcion");
		rwPaginacion.add(txtPaginaActual);
		btnProximo = new Button();
		ResourceImageReference imageReference2 = new ResourceImageReference(
				"/echopointng/resource/images/smallrightarrow.gif");
		btnProximo.setIcon(imageReference2);
		RowLayoutData btnProximoLayoutData = new RowLayoutData();
		btnProximoLayoutData.setInsets(new Insets(new Extent(20, Extent.PX),
				new Extent(0, Extent.PX), new Extent(0, Extent.PX), new Extent(
						0, Extent.PX)));
		btnProximo.setLayoutData(btnProximoLayoutData);
		rwPaginacion.add(btnProximo);
		rowFiltrado = new Row();
		rowFiltrado.setStyleName("2OpenLabs.Row.Datos");
		column1.add(rowFiltrado);
		CbCampo = new SelectField();
		CbCampo.setStyleName("2OpenLabs.SelectField.Default");
		rowFiltrado.add(CbCampo);
		txtText = new TextField();
		txtText.setWidth(new Extent(100, Extent.PX));
		txtText.setStyleName("2OpenLabs.TextField.Campo");
		rowFiltrado.add(txtText);
		btnFiltrar = new Button();
		btnFiltrar.setText(resourceBundle
				.getString("CoreVista.componentes.rowpstabla.filtrar"));
		ResourceImageReference imageReference3 = new ResourceImageReference(
				"/com/proyecto/core/vista/echo/resource/image/icon/general/Iconos/magnifier.png");
		btnFiltrar.setIcon(imageReference3);
		btnFiltrar.setToolTipText(resourceBundle
				.getString("CoreVista.componentes.rowpstabla.filtrar"));
		btnFiltrar.setStyleName("2OpenLabs.Button.Transaccion");
		btnFiltrar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				filtrarAction(e);
			}
		});
		rowFiltrado.add(btnFiltrar);
		Row row2 = new Row();
		row2.setStyleName("2OpenLabs.Row.Separador");
		column1.add(row2);
		rowTabla = new Row();
		ColumnLayoutData rowTablaLayoutData = new ColumnLayoutData();
		rowTablaLayoutData.setAlignment(new Alignment(Alignment.CENTER,
				Alignment.DEFAULT));
		rowTabla.setLayoutData(rowTablaLayoutData);
		column1.add(rowTabla);
		tTabla = new Table();
		tTabla.setHeaderVisible(true);
		rowTabla.add(tTabla);
	}
}
